﻿// -----------------------------------------------------------------
// CTS Plugin
// -----------------------------------------------------------------
// Yêu cậu khi import plugin:
//   + Không
// -----------------------------------------------------------------
'use strict';
// -----------------------------------------------------------------
// Định nghĩa ngôn ngữ
// -----------------------------------------------------------------
var lang = 'vi';
/**
* @namespace
* Định nghĩa namespace 'cts'
*/
var cts = {
    /** Định nghĩa phiên bản CTS */
    version: '1.0'
};
/**
* @namespace
* Định nghĩa namespace 'cts.lang'
*/
cts.lang = {
    /**
    * @class
    * Định nghĩa class 'Object'
    */
    Object: {
        /**
        * Tìm đối tượng đã khởi tạo trong phạm vi cụ thể
        * @param path: chuỗi đường dẫn
        * @param scope: phạm vị cụ thể, phạm vi mặc định là window
        * @returns đối tượng javaScript, undefined trong trường hợp không tìm thấy
        */
        find: function (path, scope) {
            var segments = (path instanceof Array) ? path : path.split(".");
            scope = scope || window;
            if (scope) {
                for (var i = 0, len = segments.length; i < len; i++) {
                    if (typeof (scope[segments[i]]) === 'undefined') {
                        return undefined;
                    }
                    scope = scope[segments[i]];
                }
            }
            return scope;
        },
        /**
        * Tạo đối tượng tại phạm vi cụ thể
        * @param path: chuỗi đường dẫn
        * @param scope: phạm vị cụ thể, phạm vi mặc định là window
        * @returns đối tượng javascript
        */
        create: function (path, scope) {
            var segments = (path instanceof Array) ? path : path.split(".");
            scope = scope || window;
            if (scope) {
                for (var i = 0, len = segments.length; i < len; i++) {
                    if (!scope[segments[i]]) {
                        scope[segments[i]] = {};
                    }
                    scope = scope[segments[i]];
                }
            }
            return scope;
        },
        /**
        * Sao chép thuộc tính của đối tượng
        * @param object: đối tượng sao chép
        * @param properties: thuộc tính sao chép
        * @param deep: độ sâu thuộc tính
        * @returns đối tượng javascript
        */
        populate: function (object, properties, deep) {
            if (deep && object instanceof Array && properties instanceof Array) {
                Array.prototype.push.apply(object, properties);
            } else {
                for (var key in properties) {
                    if (deep && object[key] && (typeof (object[key]) === 'object')) {
                        this.populate(object[key], properties[key], true);
                    } else {
                        object[key] = properties[key];
                    }
                }
            }
            return object;
        },
        /**
        * Hủy bỏ đối tượng
        * @param object: đối tượng javascript
        */
        dispose: function (object) {
            for (var property in object) {
                if (object.hasOwnProperty(property)) {
                    delete object[property];
                }
            }
        }
    },
    /**
    * @class
    * Định nghĩa class 'Class'
    */
    Class: {
        /**
        * Khởi tạo một đối tượng cụ thể
        * @param path: chuỗi đường dẫn
        * @param properties: thuộc tính đối tượng
        * @returns đối tượng javascript
        */
        declare: function (path, properties) {
            // Tìm đối tượng đã khởi tạo tại window
            var clazz = cts.lang.Object.find(path);
            // Trượng hợp đối tượng không tồn tại
            if (!clazz) {
                // Tạo constructor cho đối tượng
                clazz = function () {
                    this.initialize.apply(this, arguments);
                };
                // Thêm thuộc tính chung cho đối tượng
                cts.lang.Object.populate(clazz, this.methods);
                // Lưu trữ đối tượng vào namespace
                var index = path.lastIndexOf('.');
                var namespace = (index == -1) ? window :
                    cts.lang.Object.create(path.substring(0, index));
                var name = path.substring(index + 1, path.length);
                namespace[name] = clazz;
            }
            // Thêm thuộc tính vào đối tượng
            if (properties) {
                clazz.addProperties(properties);
            }
            // Kết thúc xử lý
            return clazz;
        },
        /**
        * Danh sách phương thức tại đối tượng
        */
        methods: {
            /**
            * Thêm các thuộc tính vào đối tượng
            * @param properties: danh sách thuộc tính
            * @returns đối tượng javascript
            */
            addProperties: function (properties) {
                // Thêm vào thuộc tính static
                if (properties._static) {
                    cts.lang.Object.populate(this, properties._static);
                    delete properties._static;
                }
                // Thêm các thuộc tính prototype
                cts.lang.Object.populate(this.prototype, properties);
                // Kết thúc xử lý
                return this;
            }
        }
    }
};